package cn.huijielong.modules.solitaire.service.impl;

import java.util.List;
import java.util.Map;
import java.util.function.Consumer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;

import cn.huijielong.common.exception.VSException;
import cn.huijielong.common.utils.LogMessage;
import cn.huijielong.common.utils.Query;
import cn.huijielong.common.validator.ValidatorUtils;
import cn.huijielong.common.validator.group.Group;
import cn.huijielong.modules.oss.entity.OssFileEntity;
import cn.huijielong.modules.oss.service.OssFileService;
import cn.huijielong.modules.solitaire.dao.SolitaireDao;
import cn.huijielong.modules.solitaire.entity.SolitaireEntity;
import cn.huijielong.modules.solitaire.service.SolitaireService;
import cn.huijielong.modules.sys.service.impl.SimpleServiceImpl;



@Service("solitaireService")
public class SolitaireServiceImpl extends SimpleServiceImpl implements SolitaireService {
	@Autowired
	private SolitaireDao solitaireDao;
	@Autowired
	private OssFileService ossFileService;
	
	@Override
	public SolitaireEntity queryObject(Long solitaireId){
		return solitaireDao.queryObject(solitaireId);
	}
	
	@Override
	public Page<SolitaireEntity> queryList(Query q){
	    Page<SolitaireEntity> page=PageHelper.startPage(q.getPage(), q.getLimit()).doSelectPage(()-> solitaireDao.queryList(q));
		return page;		
	}
	
	@Override
	public int queryTotal(Map<String, Object> map){
		return solitaireDao.queryTotal(map);
	}
	@Transactional
	@Override
	public void save(SolitaireEntity solitaire,Consumer<SolitaireEntity> call){
		ValidatorUtils.validateEntity(solitaire, Group.class);
		solitaireDao.save(solitaire);
		if(call!=null) {
			call.accept(solitaire);
		}
	}
	@Transactional
	@Override
	public void update(SolitaireEntity solitaire,Consumer<SolitaireEntity> call){
		SolitaireEntity se=solitaireDao.queryObject(solitaire.getSolitaireId());
		if(!"0".equals(se.getStatus())) {
			String logMsg=LogMessage.create("接龙管理", "修改").append("{solitaireId=%d,status=%s}过期数据不能修改").format(se.getSolitaireId(),se.getStatus());
			logger.error(logMsg);
			throw new VSException("已经过期，不能再修改");
		}
		solitaireDao.update(solitaire);
		if(call!=null) {
			call.accept(solitaire);
		}
	}
	
	@Override
	public void delete(Long solitaireId){
		solitaireDao.delete(solitaireId);
	}
	
	@Override
	public void deleteBatch(Long[] solitaireIds){
		solitaireDao.deleteBatch(solitaireIds);
	}

	@Override
	public void uploadHeadImage(List<MultipartFile> img, Long solitaireId, boolean add) {
		OssFileEntity ossGroup=new OssFileEntity();
		ossGroup.setTableId(solitaireId);
		ossGroup.setStoreType(OssFileEntity.STORE_TYPE_0);
		ossGroup.setTableType(OssFileEntity.TABLE_TYPE_3);
		ossGroup.setStatus("0");
		ossGroup.setUploadFile(img);
		
		if(add) {
			ossFileService.save(ossGroup);
		}else {
			ossFileService.update(ossGroup);
		}
		SolitaireEntity entity=new SolitaireEntity();
		entity.setSolitaireId(solitaireId);
		entity.setHeadImg(ossGroup.getFirstUrl());
		solitaireDao.updateHeadImg(entity);
	}

	@Override
	public void updateOverdue() {
		List<Long> ids=solitaireDao.getOverdue();
		if(ids!=null && ids.size()>0) {
			solitaireDao.updateOverdue(ids);
		}
	}
	
}
